#include <iostream>
#include <string>
#include <vector>
#include <chrono>
#include <sw/redis++/redis++.h>
#include "../util.hpp"
using namespace std::chrono_literals;	// 字面量
using sw::redis::Redis;

void test1(Redis& redis){
    std::cout << "lpush & rpush & lrange" << std::endl;
    redis.flushall();  
    
    redis.lpush("mylist", "111"); // 插入单个元素, 基于初始化列表
    // 插入一组元素, 基于迭代器
    std::vector<std::string> values = {"222", "333", "444"};
    redis.rpush("mylist", values.begin(), values.end());

    // 获取列表元素
    std::vector<std::string> res;
    // auto it = std::back_inserter(res);
    redis.lrange("mylist", 0, -1, std::back_insert_iterator(res));
    printContainer(res);
}

void test2(Redis& redis){
    std::cout << "lpop 和 rpop" << std::endl;
    redis.flushall();
 
    // 构造一个 list
    redis.rpush("key", {"1", "2", "3", "4"});
 
    auto result = redis.lpop("key");
    if (result) std::cout << "lpop: " << result.value() << std::endl;
    
    result = redis.rpop("key");
    if (result) std::cout << "rpop: " << result.value() << std::endl;
}

void test3(Redis& redis){
    std::cout << "blpop" << std::endl;
    redis.flushall();  

    auto res = redis.blpop({"key1", "key2"}, 5s);
    if (res) {
        std::cout << "blpop: " << res->first << ", " << res->second << std::endl;
    } else {
        std::cout << "blpop timeout" << std::endl;
    }
}

void test4(Redis& redis){
    std::cout << "llen" << std::endl;
    redis.flushall();  

    redis.rpush("mylist", {"1", "2", "3", "4"});
    auto len = redis.llen("mylist");
    std::cout << "Length of mylist: " << len << std::endl;
}




int main(){
    sw::redis::Redis redis("tcp://127.0.0.1:6379");
    // 如果 Redis 设置了密码，请在这里添加认证
    redis.auth("123456");  // 替换 Redis 密码
    // 测试函数
    test4(redis);

    return 0;
}